PostgerSQL 全文搜索 其他函数和操作符
1 背景知识
本章主要全文搜索的函数和操作符。
2 文档(tsvector)操作符和函数
文档解析介绍了如何将文本文档转换为 tsvector
文档。PostgreSql 提供了更多操作符和函数操作 tsvector
文档。
更多的函数和操作符请见官方文档
2.1 ||
||
是指连接操作符,tsvector || tsvector
将两个 tsvector
值联合在一起。在连接过程中 位置
和 权重
标签将会被保留。
2.2 setweight
函数
setwetight 函数将返回 tsvector
值,并且为每个 词
的 位置
标注权重(A、B、C、D,D是默认值,默认不会被显示)。
- 函数定义。
setweight(vector tsvector, weight "char") returns tsvector
- 查询示例。
SELECT setweight(fulltext,'A') from film ;
//屏幕输出:
setweight
------------------------------------------------------------------
'agent':10A 'brilliant':4A 'cat':18A 'charact':5A 'find':16A 'graffiti':2A 'gulf':21A 'man':13A 'mexico':23A 'must':15A 'secret':9A 'stranger':1A 'studi'
:6A
... ... ... ...
SELECT setweight(fulltext,'D') from film ;
setweight
------------------------------------------------
'agent':10 'brilliant':4 'cat':18 'charact':5 'find':16 'graffiti':2 'gulf':21 'man':13 'mexico':23 'must':15 'secret':9 'stranger':1 'studi':6
'boat':22
2.3 length
函数
- 语法定义。返回一个文档中
词位
的个数
length(_`vector`_ `tsvector`) returns `integer`
- 示例。
SELECT length(fulltext) from film ;
//屏幕输出:
length
--------
13
13
... ... ...
12
11
(1000 rows)
2.4 strip
函数
- 语法定义。此函数将返回一个去除
位置
和权重信息
tsvector
。
strip(_`vector`_ `tsvector`) returns `tsvector`
- 示例。
SELECT strip(fulltext) from film;
//屏幕输出:
strip
---------
'agent' 'brilliant' 'cat' 'charact' 'find' 'graffiti' 'gulf' 'man' 'mexico' 'must' 'secret' 'stranger' 'studi'
'boat' 'butler'
3 查询(tsqurey)操作符和函数
查询解析介绍了创建 tsquery
值。PostgreSQL 提供更多了函数和运算符,用于操作 tsquery
。
3.1 tsquery && tsquery
&&
是 AND
与的关系。表示两个查询都需要匹配。
3.2 tsquery || tsquery
||
是 OR
或的关系。表示两个查询至少匹配一个。
3.3 !! tsquery
!!
是 NOT
取非的关系。表示不匹配的查询。
3.4 tsquery <-> tsquery
tsquery 操作符 <->
(FOLLOWED BY) 可以搜索短语是否匹配。注意它会忽略 停用词
。
例如 :fat
和 rat
是紧挨着的。或者,fat
和 cat
是紧挨着的 查询
。可以表述为以下形式。
SELECT to_tsquery('fat') <-> to_tsquery('cat | rat');
//屏幕输出:
?column?
-----------------------------
'fat' <-> ( 'cat' | 'rat' )
(1 row)
3.5 tsquery_phrase
- 语法定义。返回一个
查询
术语。此查询
将会包含两个词的之间的距离。
tsquery_phrase(query1 tsquery, query2 tsquery [, distance integer ]) returns tsquery
- 例如,单词
fat
与cat
相差10个单词的距离。
SELECT tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10);
//屏幕输出:
tsquery_phrase
------------------
'fat' <10> 'cat'
(1 row)
3.6 numnode
- 语法定义。返回
tsquery
的有效匹配数量。可用于验证tsquery
有效匹配数量。(如果返回数量<= 0 ,查询则无意义)。
numnode(query tsquery) returns integer
- 例如:返回结果为
0
情况
SELECT numnode(plainto_tsquery('the any'));
//屏幕输出:
NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored
numnode
---------
0
(1 row)
- 例如:返回结构为
3
情况。
SELECT numnode('foo & bar'::tsquery);
numnode
---------
3
(1 row)
3.7 querytree
- 语法定义。返回可用于索引的
查询
。此函数检测此查询是否支持索引扫描。
querytree(query tsquery) returns text
SELECT querytree(to_tsquery('defined'));
//屏幕输出:
querytree
-----------
'defin'
SELECT querytree(to_tsquery('!defined'));
//屏幕输出:
querytree
-----------
T
4 收集文档统计信息
ts_stat
函数对于检查 预定义配置 和 停用词
的有效性非常有用。
4.1 语法大纲
ts_stat
函数通过 tsquery
检查 tsvector
中的统计信息。
返回值 | 说明 |
---|---|
word | 文档中出现的词位值,为text 类型。 |
ndoc | 文档中包含此 词位 的文档数量,为 interger 类型。 |
nentry | 在所有文档中 词位 出现的数量总数。 |
ts_stat(sqlquery text, [ weights text, ]
OUT word text, OUT ndoc integer,
OUT nentry integer) returns setof record
4.2 在文档集合中查找最常用的十个单词
SELECT * FROM ts_stat('SELECT fulltext FROM film')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;
//屏幕输出:
word | ndoc | nentry
---------+------+--------
must | 1000 | 1000
mad | 165 | 176
boat | 158 | 167
woman | 136 | 142
man | 118 | 125
ancient | 124 | 124
shark | 114 | 118
abandon | 111 | 111
drama | 106 | 106
display | 105 | 105
(10 rows)
4.3 在文档集合中查找权重为 AB
的词位统计信息
SELECT * FROM ts_stat('SELECT fulltext FROM film', 'ab')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;
word | ndoc | nentry
------+------+--------
(0 rows)
Note
由于 fulltext
文档中的词位没有权重值,所以这里搜索出来是 0
行。